home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / numbers.r < prev    next >
Text File  |  1994-11-16  |  6KB  |  344 lines

  1.  
  2. ;---;  numbers.r  ;------------------------------------------------------------
  3. *
  4. *    ****    NUMBER IN & OUTPUT ROUTINES    ****
  5. *
  6. *    Author        Daniel Weber
  7. *    Version        1.00
  8. *    Last Revision    16.11.94
  9. *    Identifier    nbr_defined
  10. *    Prefix        nbr_    (number)
  11. *                 ¯  ¯ ¯
  12. *    Routines    GetHexNumber, GetDecNumber, GetBinNumber, GetOctNumber,
  13. *            ItoA
  14. *
  15. ;------------------------------------------------------------------------------
  16.  
  17. ;------------------
  18.     ifnd    nbr_defined
  19. nbr_defined    =1
  20.  
  21. ;------------------
  22. nbr_oldbase    equ __base
  23.     base    nbr_base
  24. nbr_base:
  25.  
  26. ;------------------
  27.  
  28. nbr_reglist    REG    d2-d4        ; standard register list
  29.  
  30.  
  31. ;------------------------------------------------------------------------------
  32. *
  33. * GetHexNumber    - Try to get a hexadecimal number. "$" and C-style "0x"
  34. *          introducers supported
  35. *
  36. * INPUT:    a0    String to interprete.
  37. *
  38. * RESULT:    d0    Result.
  39. *        d1    0 if error, -1 if okay.
  40. *        a0    updated pointer (after number)
  41. *        ccr    On d1.
  42. *
  43. ;------------------------------------------------------------------------------
  44.     IFD    xxx_GetHexNumber
  45.     NEED_    nbr_getchar
  46.     NEED_    nbr_prefix
  47.  
  48. GetHexNumber:
  49.     movem.l    nbr_reglist,-(a7)
  50.     moveq    #0,d0            ;number...
  51.     moveq    #0,d3            ;mark
  52.     moveq    #8,d6            ;max #of digits to read
  53.     bsr    nbr_prefix
  54.     cmp.b    #"$",(a0)+        ;$...
  55.     beq.s    ..hex
  56.     cmp.b    #"0",-(a0)        ;0x...
  57.     bne.s    ..err
  58.     cmp.b    #"x",1(a0)
  59.     bne.s    ..err
  60.     addq.l    #2,a0
  61.  
  62.     moveq    #8,d1
  63. .hexloop:
  64.     bsr    nbr_getchar
  65.     sub.b    #"A",d0
  66.     bcc.s    1$
  67.     addq.b    #7,d0
  68.     bpl.s    2$
  69. 1$:    add.b    #10,d0
  70.     cmp.b    #15,d0
  71.     bhi.s    2$
  72.     lsl.l    #4,d2
  73.     or.b    d0,d2
  74.     moveq    #1,d3
  75.     dbra    d1,.hexloop
  76.     bra    nbr_failed        ;overflow
  77. 2$:    move.l    d2,d0
  78.     bra    nbr_exit
  79.     ENDC
  80.  
  81.  
  82.  
  83. ;------------------------------------------------------------------------------
  84. *
  85. * GetDecNumber    - Try to get a decimal number.
  86. *
  87. * INPUT:    a0    String to interprete.
  88. *
  89. * RESULT:    d0    Result.
  90. *        d1    0 if error, -1 if okay.
  91. *        a0    points after decimal number
  92. *        ccr    On d1.
  93. *
  94. ;------------------------------------------------------------------------------
  95.     IFD    xxx_GetDecNumber
  96.     NEED_    nbr_prefix
  97. GetDecNumber:
  98.     movem.l    nbr_reglist,-(a7)
  99.     bsr    nbr_prefix
  100.     moveq    #0,d0
  101.     moveq    #0,d1
  102.     moveq    #0,d3
  103. 0$:    move.b    (a0)+,d1
  104.     sub.b    #"0",d1
  105.     cmp.b    #9,d1
  106.     bhi.s    1$
  107.     moveq    #1,d3
  108.     move.l    d0,d4
  109.     lsl.l    #3,d0
  110.     add.l    d4,d4
  111.     add.l    d4,d0
  112.     add.l    d1,d0
  113.     bra.s    0$
  114. 1$:    tst.w    d3
  115.     sne    d1
  116.     tst.b    d1
  117.     movem.l    (a7)+,_movemlist
  118.     rts
  119.     ENDC
  120.  
  121.  
  122.  
  123.  
  124. ;------------------------------------------------------------------------------
  125. *
  126. * GetBinNumber    - Try to get a binary number (%...).
  127. *
  128. * INPUT:    a0    String to interprete.
  129. *
  130. * RESULT:    d0    Result.
  131. *        d1    0 if error, -1 if okay.
  132. *        a0    points after decimal number
  133. *        ccr    On d1.
  134. *
  135. ;------------------------------------------------------------------------------
  136.     IFD    xxx_GetBinNumber
  137.     NEED_    nbr_prefix
  138.     NEED_    nbr_failed
  139.     NEED_    nbr_exit
  140. GetBinNumber:
  141.     movem.l    nbr_reglist,-(a7)
  142.     bsr    nbr_prefix
  143.     moveq    #32,d4            ;max # of bits
  144.     moveq    #0,d0
  145.     moveq    #0,d3
  146.  
  147. 1$:    move.b    (a0)+,d1
  148.     sub.b    #"0",d1
  149.     cmp.b    #1,d1
  150.     bhi    nbr_exit
  151.     add.l    d0,d0
  152.     or.b    d1,d0
  153.     moveq    #1,d3
  154.     dbra    d4,1$
  155.     bra    nbr_failed
  156.     ENDC
  157.  
  158.  
  159.  
  160. ;------------------------------------------------------------------------------
  161. *
  162. * GetOctNumber    - Try to get a octal number (0...).
  163. *
  164. * INPUT:    a0    String to interprete.
  165. *
  166. * RESULT:    d0    Result.
  167. *        d1    0 if error, -1 if okay.
  168. *        a0    points after decimal number
  169. *        ccr    On d1.
  170. *
  171. ;------------------------------------------------------------------------------
  172.     IFD    xxx_GetOctNumber
  173.     NEED_    nbr_prefix
  174. GetOctNumber:
  175.     movem.l    d2-d7/a1-a6,-(a7)
  176.     bsr    nbr_prefix
  177.     moveq    #11,d4
  178.     moveq    #0,d0
  179. .oct:    move.b    (a0)+,d1
  180.     sub.b    #"0",d1
  181.     cmp.b    #7,d1
  182.     bhi    nbr_exit
  183.     lsl.l    #3,d0
  184.     or.b    d1,d0
  185.     moveq    #1,d3
  186.     dbra    d4,.oct
  187.     bra    nbr_failed
  188.     ENDC
  189.  
  190.  
  191.  
  192. ;------------------------------------------------------------------------------
  193. *
  194. * ItoA    - Integer (32 bit) to ASCII
  195. *
  196. * INPUT        d0:    integer value
  197. *        d1:    length of buffer
  198. *        a0:    buffer for integer string
  199. *
  200. * RESULT    d0:    pointer to buffer
  201. *        a0:    pointer to buffer after integer string
  202. *
  203. ;------------------------------------------------------------------------------
  204.     IFD    xxx_ItoA
  205. ItoA:    movem.l    d2-d5/a0-a1,-(a7)
  206.     lea    nbr_10(pc),a1
  207.  
  208. nbr_Ito    moveq    #0,d4
  209. .ito:    move.l    (a1)+,d2
  210.     beq.s    .zero
  211.     moveq    #-1,d3
  212.  
  213. 0$:    sub.l    d2,d5
  214.     dbcs    d3,0$
  215.     add.l    d2,d5
  216.     addq.w    #1,d3
  217.     bne.s    1$
  218.     tst.w    d4
  219.     beq.s    .ito
  220.  
  221. 1$:    moveq    #-1,d4
  222.     subq.w    #1,d1
  223.     bmi.s    .err
  224.     neg.b    d3
  225.     add.b    #"0",d3
  226.     move.b    d3,(a0)+
  227.     bra.s    .ito
  228.  
  229. .zero:    subq.w    #1,d1
  230.     bmi.s    .err
  231.     add.b    #"0",d5
  232.     move.b    d5,(a0)+
  233.  
  234. .err:    
  235. .exit:    exg    a0,d0
  236.     moven.l    (a7)+,_movemlist
  237.     exg    a0,d0
  238.     rts
  239.  
  240.  
  241.  
  242.  
  243. ;------------------
  244. nbr_10:    dc.l 1000000000
  245.     dc.l 100000000
  246.     dc.l 10000000
  247.     dc.l 1000000
  248.     dc.l 100000
  249.     dc.l 10000            ;word from here
  250.     dc.l 1000
  251.     dc.l 100
  252.     dc.l 10
  253.     dc.l 0
  254.  
  255.     ENDC
  256.  
  257.  
  258.  
  259.  
  260. ;------------------------------------------------------------------------------
  261. *
  262. * used subroutines
  263. *
  264. ;------------------------------------------------------------------------------
  265.  
  266. ;
  267. ; nbr_exit    - standard exit routine
  268. ;
  269.     IFD    xxx_nbr_exit
  270.     NEED_    nbr_failed
  271. nbr_exit:
  272.     tst.b    d3
  273.     beq.s    nbr_failed
  274.     tst.b    d7
  275.     beq.s    1$
  276.     neg.l    d0
  277. 1$:    subq.l    #1,a0
  278.     moveq    #-1,d1
  279.     movem.l    (a7)+,nbr_reglist
  280.     rts
  281.     ENDC
  282.  
  283.  
  284. ;
  285. ; nbr_failed    - standard exit routtine if failed
  286. ;
  287.     IFD    xxx_nb_failed
  288. nbr_failed:
  289.     movem.l    (a7)+,nbr_reglist
  290.     moveq    #0,d1
  291.     rts
  292.     ENDC
  293.  
  294.  
  295.  
  296. ;
  297. ; nbr_getchar    - get an uppercased character
  298. ;
  299. ; a0: pointer
  300. ; => d0: (uppercase) char
  301. ;    a0: a0+1
  302. ;
  303.     IFD    xxx_nbr_getchar
  304. nbr_getchar:
  305.     move.b    (a0)+,d0
  306.     cmp.b    #"a",d0
  307.     blt.s    .out
  308.     cmp.b    #"z",d0
  309.     bhi.s    .out
  310.     and.b    #$df,d0            ; convert to uppercase
  311. .out:    rts
  312.     ENDC
  313.  
  314.  
  315.  
  316. ;
  317. ; nbr_prefix    - get prefix
  318. ;
  319. ; a0: pointer
  320. ; => d7: prefix (0: positive -1: negative)
  321. ;    a0: updated
  322. ;
  323.     IFD    xxx_nbr_prefix
  324. nbr_prefix:
  325.     moveq    #-1,d7            ;sign
  326. ..sign:    not.b    d7
  327.     cmp.b    #"-",(a0)+
  328.     beq.s    ..sign
  329.     subq.l    #1,a0
  330.     rts
  331.     ENDC
  332.  
  333.  
  334.  
  335.  
  336. ;--------------------------------------------------------------------
  337.  
  338.     base    nbr_oldbase
  339.  
  340.     ENDC
  341.  
  342.     end
  343.  
  344.